package com.rui.shangXueTang.array;

/**
 * @author : [锐神NO.3]
 * @version : [v1.0]
 * @className : SparseArray
 * @createTime : [2022/2/14 16:28]
 * @description : [二维数组和稀疏数组转换，链表形式]
 */

public class SparseArray {
    public static void main(String[] args) {

        //模拟出来棋盘数据，使用二维数组
        int[][] array = new int[11][11];
        array[1][2] = 1;
        array[2][4] = 2;

        //遍历二维数组
        for (int[] value : array) {
            for (int i : value) {
                System.out.print(i + "\t");
            }
            System.out.println("");
        }

        System.out.println("------------------");

        //需要把以上数据压缩到稀疏数组中
        //计算二维数组中的非零个数
        int notZeroCount = 0;
        for (int[] ints : array) {
            for (int anInt : ints) {
                if (anInt != 0) {
                    notZeroCount++;
                }
            }
        }

        //稀疏数组的格式：[行，列，值]
        int[][] sparseArray = new int[notZeroCount + 1][3];
        sparseArray[0][0] = array.length;
        sparseArray[0][1] = array[0].length;
        sparseArray[0][2] = notZeroCount;

        //把非零数据放入稀疏数组中
        int count = 0;
        for(int i = 0; i < array.length; i++) {
            for(int j = 0; j < array[i].length; j++) {
                if(array[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = array[i][j];
                }
            }
        }

        //打印稀疏数组
        for (int[] row : sparseArray){
            for(int i : row) {
                System.out.print(i + "\t");
            }
            System.out.println("");
        }

        System.out.println("------------------");

        //将稀疏数组转为二维数组
        int[][] array2 = new int[sparseArray[0][0]][sparseArray[0][1]];

        //遍历稀疏数组
        for(int i = 1; i < sparseArray.length; i++) {
            array2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        //打印二维数组
        for (int[] row : array2){
            for(int i : row) {
                System.out.print(i + "\t");
            }
            System.out.println("");
        }
    }
}
